package com.witmore.neutron.ai.mcp.server.trading;

import com.witmore.neutron.ai.mcp.server.trading.db.entity.ScorpionTradingUserDO;
import com.witmore.neutron.ai.mcp.server.trading.dto.StockAnalysisReportDTO;
import com.witmore.neutron.ai.mcp.server.trading.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

/**
 * 股票异动分析MCP服务器
 * 提供股票异动分析功能，整合多数据源进行综合分析
 *
 * @author 豆子高
 * @date 2025-01-20
 */
@Slf4j
@Service
public class StockAbnormalAnalysisMcpServer {

    @Autowired
    private StockAnalysisService stockAnalysisService;

    @Autowired
    private StockAIAnalysisService stockAIAnalysisService;

    @Autowired
    private AlertConfigService alertConfigService;

    @Autowired
    private PdfReportService pdfReportService;

    @Autowired
    private OssUploadService ossUploadService;

    /**
     * 股票财务分析工具
     *
     * 功能说明：
     * 1. 根据股票代码获取财务报表数据（资产负债表、利润表、现金流量表）
     * 2. 利用AI进行专业财务分析
     * 3. 生成包含盈利能力、偿债能力、营运能力、成长能力、现金流分析的报告
     * 4. 提供基于财务数据的投资建议（买入/持有/谨慎观望/规避）
     *
     * @param stockCode 股票代码（如：000001、600036、300750等）
     * @param userPhone 用户手机号（用于记录分析历史）
     * @param analysisDepth 分析深度：简单/详细/深度，默认为"详细"
     * @return 完整的股票财务分析报告
     */
//    @Tool(description = "股票财务分析工具：基于财务报表数据提供专业分析报告")
    public String analyzeStockAbnormal(
            @ToolParam(description = "股票代码，支持A股代码格式，如：000001、600036、300750等") String stockCode,
            @ToolParam(description = "$_yumo_agent_user_phone_$") String userPhone,
            @ToolParam(description = "分析深度，可选值：简单、详细、深度，默认为详细",required = false) String analysisDepth) {

        try {
            log.info("开始股票异动分析 - 股票代码: {}, 用户: {}, 分析深度: {}", stockCode, userPhone, analysisDepth);

            // 参数验证
            if (!StringUtils.hasText(stockCode)) {
                return createErrorResponse("股票代码不能为空");
            }

            // 规范化股票代码格式
            stockCode = normalizeStockCode(stockCode);
            if (!isValidStockCode(stockCode)) {
                return createErrorResponse("股票代码格式不正确，请输入有效的A股代码（如：000001、600036、300750）");
            }

            // 设置默认分析深度
            if (!StringUtils.hasText(analysisDepth)) {
                analysisDepth = "详细";
            }

            log.info("参数验证通过，开始数据收集和分析");

            // 获取或创建用户（用于OSS文件命名）
            ScorpionTradingUserDO user = null;
            if (StringUtils.hasText(userPhone)) {
                user = alertConfigService.findOrCreateUser(userPhone);
            }

            // 第一步：收集股票财务数据
            StockAnalysisReportDTO report = stockAnalysisService.collectStockFinancialDataForAnalysis(stockCode);

            if (report == null) {
                return createErrorResponse("获取股票数据失败，请稍后重试");
            }

            // 第二步：AI财务分析生成报告
            report = stockAIAnalysisService.generateFinancialAnalysisReport(report);

            // 第三步：根据分析深度调整报告内容
            report = adjustReportByDepth(report, analysisDepth);

            // 第四步：生成PDF报告并上传到OSS
            String pdfUrl = generateAndUploadPdfReport(report, user);

            // 第五步：格式化输出
            String result = formatAnalysisReport(report, pdfUrl);

            log.info("股票异动分析完成 - 股票代码: {}, 综合评分: {}, 投资建议: {}",
                    stockCode, report.getOverallScore(), report.getInvestmentRecommendation());

            return result;

        } catch (Exception e) {
            log.error("股票异动分析失败 - 股票代码: {}, 错误: {}", stockCode, e.getMessage(), e);
            return createErrorResponse("分析过程中发生错误：" + e.getMessage());
        }
    }

    /**
     * 快速股票基本面分析工具
     * 仅进行基础的财务和估值分析，响应速度更快
     *
     * @param stockCode 股票代码
     * @param userPhone 用户手机号
     * @return 基本面分析结果
     */
//    @Tool(description = "快速股票基本面分析：提供股票的基础财务指标和估值分析，响应速度较快")
    public String quickFundamentalAnalysis(
            @ToolParam(description = "股票代码，如：000001、600036等") String stockCode,
            @ToolParam(description = "$_yumo_agent_user_phone_$") String userPhone) {

        try {
            log.info("开始快速基本面分析 - 股票代码: {}, 用户: {}", stockCode, userPhone);

            // 参数验证
            if (!StringUtils.hasText(stockCode)) {
                return createErrorResponse("股票代码不能为空");
            }

            stockCode = normalizeStockCode(stockCode);
            if (!isValidStockCode(stockCode)) {
                return createErrorResponse("股票代码格式不正确");
            }

            // 收集财务数据
            StockAnalysisReportDTO report = stockAnalysisService.collectStockFinancialDataForAnalysis(stockCode);

            // 进行财务分析
            report = stockAIAnalysisService.generateFinancialAnalysisReport(report);

            // 格式化输出（仅基本面内容）
            StringBuilder result = new StringBuilder();
            result.append("# 快速基本面分析报告\n\n");
            result.append("**股票代码：** ").append(stockCode).append("\n");
            result.append("**分析时间：** ").append(java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))).append("\n\n");

            // 显示财务分析结果
            if (report.getFinancialAnalysis() != null) {
                result.append(report.getFinancialAnalysis()).append("\n");
            }

            if (report.getProfitabilityAnalysis() != null) {
                result.append(report.getProfitabilityAnalysis()).append("\n");
            }

            if (report.getSolvencyAnalysis() != null) {
                result.append(report.getSolvencyAnalysis()).append("\n");
            }

            result.append("**风险等级：** ").append(report.getRiskLevel()).append("级\n");
            result.append("**投资建议：** ").append(report.getInvestmentRecommendation()).append("\n");
            result.append("**综合评分：** ").append(report.getOverallScore()).append("/100分\n\n");
            result.append("*注：这是快速分析结果，如需更全面的分析请使用完整分析工具。*");

            log.info("快速基本面分析完成 - 股票代码: {}", stockCode);
            return result.toString();

        } catch (Exception e) {
            log.error("快速基本面分析失败 - 股票代码: {}, 错误: {}", stockCode, e.getMessage(), e);
            return createErrorResponse("快速分析失败：" + e.getMessage());
        }
    }

    /*
     * 已删除：analyzeStockNewsSentiment 方法
     * 原因：重构为专注财务报表分析，不再提供新闻分析功能
     */



    // ==================== 私有辅助方法 ====================

    /**
     * 规范化股票代码格式
     */
    private String normalizeStockCode(String stockCode) {
        if (stockCode == null) {
            return null;
        }
        // 移除空格和特殊字符，转换为大写
        return stockCode.trim().replaceAll("[^0-9A-Za-z]", "").toUpperCase();
    }

    /**
     * 验证股票代码格式
     */
    private boolean isValidStockCode(String stockCode) {
        if (stockCode == null || stockCode.length() != 6) {
            return false;
        }
        // A股代码规则：6位数字
        return stockCode.matches("\\d{6}");
    }

    /**
     * 根据分析深度调整报告内容
     */
    private StockAnalysisReportDTO adjustReportByDepth(StockAnalysisReportDTO report, String depth) {
        // 这里可以根据不同的深度要求调整报告的详细程度
        // 简化实现，实际可以根据需求进行更复杂的调整
        return report;
    }

    /**
     * 格式化分析报告输出
     */
    private String formatAnalysisReport(StockAnalysisReportDTO report, String pdfUrl) {
        StringBuilder result = new StringBuilder();

        result.append("# 股票异动综合分析报告\n\n");
        result.append("**股票代码：** ").append(report.getStockCode());
        if (report.getStockName() != null) {
            result.append("（").append(report.getStockName()).append("）");
        }
        result.append("\n");
        result.append("**分析时间：** ").append(java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))).append("\n\n");

        // 核心结论
        result.append("## 🎯 核心结论\n\n");
        result.append("**综合评分：** ").append(report.getOverallScore()).append("/100分\n");
        result.append("**风险等级：** ").append(report.getRiskLevel()).append("级（").append(report.getRiskDescription()).append("）\n");
        result.append("**投资建议：** ").append(report.getInvestmentRecommendation()).append("\n");
        result.append("**建议理由：** ").append(report.getRecommendationReason()).append("\n\n");

        // 财务分析
        if (report.getFinancialAnalysis() != null) {
            result.append(report.getFinancialAnalysis()).append("\n");
        }

        // 盈利能力分析
        if (report.getProfitabilityAnalysis() != null) {
            result.append(report.getProfitabilityAnalysis()).append("\n");
        }

        // 偿债能力分析
        if (report.getSolvencyAnalysis() != null) {
            result.append(report.getSolvencyAnalysis()).append("\n");
        }

        // 营运能力分析
        if (report.getOperationalAnalysis() != null) {
            result.append(report.getOperationalAnalysis()).append("\n");
        }

        // 成长能力分析
        if (report.getGrowthAnalysis() != null) {
            result.append(report.getGrowthAnalysis()).append("\n");
        }

        // 现金流分析
        if (report.getCashFlowAnalysis() != null) {
            result.append(report.getCashFlowAnalysis()).append("\n");
        }

        // 新闻分析已移除，专注财务报表分析

        // 研报分析
        if (report.getResearchAnalysis() != null) {
            result.append(report.getResearchAnalysis()).append("\n");
        }

        // 目标价格
        if (report.getTargetPriceRange() != null) {
            result.append("## 📈 目标价格\n\n");
            result.append(report.getTargetPriceRange()).append("\n\n");
        }

        // AI总结
        if (report.getAiSummary() != null) {
            result.append(report.getAiSummary()).append("\n");
        }

        // PDF下载链接
        if (StringUtils.hasText(pdfUrl)) {
            result.append("## 📄 完整报告下载\n\n");
            result.append("**PDF详细报告：** [点击下载完整分析报告](").append(pdfUrl).append(")\n\n");
            result.append("*PDF报告包含完整的图表、样式和详细分析内容，建议下载查看获得最佳阅读体验。*\n\n");
        }

        return result.toString();
    }



    /**
     * 生成PDF报告并上传到OSS
     */
    private String generateAndUploadPdfReport(StockAnalysisReportDTO report, ScorpionTradingUserDO user) {
        try {
            log.info("开始生成PDF报告 - 股票代码: {}", report.getStockCode());

            // 上传到OSS
            Long userId = user != null ? user.getId() : null;

            // 生成PDF字节数组（使用增强版财务分析报告）
            byte[] pdfBytes = pdfReportService.generateEnhancedStockAnalysisReportPdf(report, userId);
            String pdfUrl = ossUploadService.uploadStockAnalysisReport(pdfBytes, report.getStockCode(), userId);

            log.info("PDF报告生成并上传成功 - 股票代码: {}, URL: {}", report.getStockCode(), pdfUrl);
            return pdfUrl;

        } catch (Exception e) {
            log.error("PDF报告生成或上传失败 - 股票代码: {}, 错误: {}", report.getStockCode(), e.getMessage(), e);
            // 即使PDF生成失败，也不影响分析结果的返回
            return null;
        }
    }



    /**
     * 创建错误响应
     */
    private String createErrorResponse(String errorMessage) {
        return String.format("❌ **分析失败**\n\n错误信息：%s\n\n请检查输入参数后重试。", errorMessage);
    }
}
